import 'package:aio/aio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:myapp/src/route/driving/text_item0【基本知识】.dart';
import 'package:myapp/src/route/driving/text_item10【9分】.dart';
import 'package:myapp/src/route/driving/text_item11【12分】.dart';
import 'package:myapp/src/route/driving/text_item12【答题技巧】.dart';
import 'package:myapp/src/route/driving/text_item13%E3%80%90%E9%81%93%E8%B7%AF%E9%80%9A%E8%A1%8C%E7%9B%B8%E5%85%B3%E7%9F%A5%E8%AF%86%E7%82%B9%E3%80%91.dart';
import 'package:myapp/src/route/driving/text_item14%E3%80%90%E5%9B%BE%E6%A0%87%E3%80%91.dart';
import 'package:myapp/src/route/driving/text_item7【1分】.dart';
import 'package:myapp/src/route/driving/text_item8【3分】.dart';
import 'package:myapp/src/route/driving/text_item9【6分】.dart';
import 'package:myapp/src/utils/image_path_utils.dart';

import 'text_item15【交警手势】.dart';
import 'text_item16【驾驶相关】.dart';
import 'text_item17【道路交通安全违法行为及处罚】.dart';
import 'text_item18【机动车基础知识】.dart';
import 'text_item19【科目二】.dart';
import 'text_item20【科目四】.dart';

///mvp基本模式；xxRoute -> _State -> _Presenter
///只需要对Route取一个名字；_State 和 _Presenter 就不用取名了。方便。
class DrvingTestRoute extends StatefulWidget {
  DrvingTestRoute();

  @override
  _State createState() => _State();
}

class _State extends State<DrvingTestRoute> {
  _Presenter presenter = _Presenter();

  @override
  void initState() {
    super.initState();
    presenter.setState = setState; //fixme setState方法直接赋值。
  }

  @override
  Widget build(BuildContext context) {
    px.init(context);
    var scaffold = LibUi.getScaffold(context, _body(context), "驾考宝典");
    return LibUi.listenerPopScope(context, scaffold, () {}, isIntercept: false);
  }

  Widget _body(BuildContext context) {
    return StatefulBuilder(
        builder: (BuildContext context, StateSetter setState) {
      presenter.setStateBody = setState;
      List<Widget> children = [];
      //========================================================================
      children.add(_item0());
      children.add(_item1());
      children.add(_item2());
      children.add(_item3());
      children.add(_item3_1());
      children.add(_item4());
      children.add(_item5());
      children.add(_item6());
      children.add(_item7());
      children.add(_item8());
      children.add(_item9());
      children.add(_item10());
      children.add(_item11());
      children.add(_item12());
      children.add(_item13());
      children.add(_item14());
      children.add(_item15());
      children.add(_item16());
      children.add(_item17());
      children.add(_item18());
      children.add(_item19());
      children.add(_item20());
      //========================================================================
      return Container(
        child: ListView(
          children: children,
        ),
        color: Colors.white,
      );
      var colum = Column(
        children: children,
      );
      return SingleChildScrollView(
        child: colum,
      );
    });
  }

  ///折叠组件
  Widget getExpansionTile(Widget title, List<Widget> children) {
    var expansionTile = LibExpansionUi.getExpansionTile(title, children);
    return LibUi.card(context, expansionTile);

    ///collapsed是折叠时的样式，默认就是折叠的。
    ///通常和ListView一起使用。
    StateSetter? _expandedSetState;
    var _isExpanded = false; //是否展开。
    var _expansionTile = ExpansionTile(
      //title 折叠时组件
      title: title,
      //tilePadding title的内补丁
      tilePadding: EdgeInsets.only(left: 24, right: 0, top: 0, bottom: 0),
      //subtitle 位于title下方。
      //subtitle: ,
      //children 展开时显示的组件
      children: children,
      //childrenPadding 折叠子组件的内补丁边距
      childrenPadding: EdgeInsets.all(0),
      //enabled true 可操作，（能够正常折叠展开）；false 不可操作，点击没反应。
      enabled: true,
      //initiallyExpanded 初始状态是否为展开状态。
      initiallyExpanded: false,
      //collapsedBackgroundColor title 组件折叠时背景色，不受collapsedShape形状控制。
      collapsedBackgroundColor: LibColors.transparent,
      //backgroundColor 组件展开之后的背景色，受shape形状控制。
      backgroundColor: LibColors.transparent,
      //clipBehavior 切割类型，防止shape圆角属性，对组件，不受影响。加了这个就可以。
      clipBehavior: Clip.antiAlias,
      //shape 正常展开时候形状,如果为空，默认张开的时候会有上下两条黑线；
      shape: LibShapeUi.RoundedRectangleBorder(
          width: 1, color: LibColors.lineColorWithGrey, radius: 0),
      //collapsedShape 折叠时形状
      collapsedShape: LibShapeUi.RoundedRectangleBorder(
          width: 1, color: LibColors.lineColorWithGrey, radius: 0),
      //textColor 展开时默认字体颜色,测试发现无效。
      textColor: Colors.black,
      //collapsedTextColor 折叠时字体颜色，测试有效。
      collapsedTextColor: Colors.black,
      //iconColor 展开时icon图标颜色
      iconColor: Colors.black,
      //collapsedIconColor 折叠时icon图标颜色
      collapsedIconColor: Colors.black,
      // onExpansionChanged: (value) {
      //   //监听状态变化；true 展开，false 折叠。initiallyExpanded初始状态不会监听。
      //   // print("=========$value");
      //   _isExpanded = value;
      //   _expandedSetState?.call(() {});
      // },
      //trailing 使用自己的折叠展开图标组件；测试发现使用自己，没有旋转效果。默认的有旋转效果。就使用默认的即可。
      // trailing: StatefulBuilder(
      //   builder: (conext, setState) {
      //     // print("=========_isExpanded:$_isExpanded");
      //     _expandedSetState = setState;
      //     return Icon(_isExpanded ? Icons.expand_less : Icons.expand_more);
      //   },
      // ),
    );
    return LibUi.card(context, _expansionTile);
  }

  var _titleFontStyle = TextStyle(fontSize: 18, color: Colors.black);
  var _expansFontStyle = TextStyle(fontSize: 16, color: Colors.black);

  Widget _item0({String title = "驾照基本知识点(常识)"}) {
    var _title = title;
    var _text = text_item0;
    return getExpansionTile(Text(_title, style: _titleFontStyle), [
      Text(
        _text,
        style: _expansFontStyle,
      )
    ]);
  }

  Widget _item1({String title = "a1a2a3b1b2c1c2c3c4c5c6分别代表什么车"}) {
    var _title = title;
    var _text = '''
    A1‌：大型客车，即乘坐人数大于等于20人的大型载客汽车，车身长度超过6米。
    A2‌：牵引车，包括重型和中型全挂、半挂汽车列车。
    A3: A3驾驶证是专为城市公交车驾驶员设立的驾照类型.
    B1‌：中型客车，车长小于6米，乘坐人数大于9人且小于20人。
    B2‌：大型货车，包括重型和中型载货汽车，总质量大于等于4500kg且小于12000kg。
    C1‌：小型汽车，包括小型载客汽车和轻型载货汽车。
    C2‌：小型自动挡汽车，包括小型自动挡载客汽车和轻型自动挡载货汽车。
    C3‌：低速载货汽车，即低速货车。
    C4‌：三轮汽车。
    C5‌：残疾人专用小型自动挡载客汽车，允许上肢、右下肢或者双下肢残疾人驾驶。
    C6‌：轻型牵引挂车，准驾车辆为总质量小于4500kg的汽车列车。
每种车型的具体定义和适用范围
    ‌大型客车（A1）‌：乘坐人数大于等于20人的大型载客汽车，车身长度超过6米。
    ‌牵引车（A2）‌：可以牵引重型和中型全挂、半挂汽车列车。
    ‌中型客车（B1）‌：车长小于6米，乘坐人数大于9人且小于20人的客车。
    ‌大型货车（B2）‌：包括重型和中型载货汽车，总质量大于等于4500kg且小于12000kg。
    ‌小型汽车（C1）‌：包括小型载客汽车和轻型载货汽车。
    ‌小型自动挡汽车（C2）‌：包括小型自动挡载客汽车和轻型自动挡载货汽车。
    ‌低速载货汽车（C3）‌：即低速货车，适用于农村地区。
    ‌三轮汽车（C4）‌：即三轮车，适用于农村地区。
    ‌残疾人专用小型自动挡载客汽车（C5）‌：允许上肢、右下肢或者双下肢残疾人驾驶。
    ‌轻型牵引挂车（C6）‌：准驾车辆为总质量小于4500kg的汽车列车。
    ''';
    return getExpansionTile(Text(_title, style: _titleFontStyle), [
      Text(
        _text,
        style: _expansFontStyle,
      )
    ]);
  }

  Widget _item2({String title = "牵引车，全挂，半挂有什么区别"}) {
    var _title = title;
    var _path = ImagePathUtils.getPathWithImageItem("全挂半挂区别.jpeg");
    var _imaege = Image.asset(_path);
    return getExpansionTile(Text(_title, style: _titleFontStyle), [_imaege]);
  }

  Widget _item3({String title = "D证、E证和F证的区别"}) {
    var _title = title;
    var _text = '''
    ‌驾驶车型‌：
     D证‌：可以驾驶普通三轮摩托车、二轮摩托车和轻便摩托车。
     E证‌：可以驾驶普通二轮摩托车和轻便摩托车。
     F证‌：只能驾驶轻便摩托车。‌12
     发动机排量‌：    
     D证‌：没有排量限制，适用于三轮摩托车。
     E证‌：适用于排量大于50ml的二轮摩托车。
     F证‌：适用于排量小于等于50ml的轻便摩托车。
     考试难度‌：     
     D证‌：考试难度较大，需要较高的驾驶技能和安全意识。
     E证‌：考试难度适中，需要一定的驾驶技能和安全意识。
     F证‌：考试难度最低，但仍然需要一定的驾驶技能和安全意识。‌2
     体车型的详细信息
     D证‌：可以驾驶普通三轮摩托车、二轮摩托车和轻便摩托车。D证考试难度较大，需要驾驶人具备较高的驾驶技能和安全意识。‌12
     E证‌：可以驾驶普通二轮摩托车和轻便摩托车。E证考试难度适中，需要一定的驾驶技能和安全意识。
     F证‌：可以驾驶排量在50CC以下的轻便摩托车。F证考试难度最低，但仍然需要驾驶人具备一定的驾驶技能和安全意识。
    ''';
    return getExpansionTile(Text(_title, style: _titleFontStyle),
        [Text(_text, style: _expansFontStyle)]);
  }

  Widget _item3_1({String title = "‌黄牌、蓝牌、白牌和绿牌分别代表不同类型的车辆和用途。"}) {
    var _title = title;
    var _text = '''
      黄牌‌：主要用于大型车辆，包括大型货车、公共汽车、长途客车等。黄牌车辆通常体积庞大、载重量大，因此在行驶过程中需要更加注意安全，遵守交通规则，避免发生交通事故‌12。
      ‌蓝牌‌：用于小型汽车，包括私家车和大部分商用车辆。蓝牌车辆在道路上行驶时必须遵守交通规则，保持安全行驶‌12。
      ‌白牌‌：主要用于警车、消防车、武警部队车辆等权力机构的车辆。白牌车辆在道路上享有优先通行权，其他车辆需要避让‌12。
      ‌绿牌‌：主要用于新能源汽车，如纯电动汽车、插电式混合动力汽车等。绿牌车辆在行驶时可以享受一些政策优惠，如免费停车、免费充电等‌12。
      这些车牌颜色的使用和管理有助于区分不同类型的车辆，确保交通秩序和公共安全。
    ''';
    return getExpansionTile(Text(_title, style: _titleFontStyle),
        [Text(_text, style: _expansFontStyle)]);
  }

  Widget _item4({String title = "科目一考试内容"}) {
    var _title = title;
    var _text = '''
    科目一需要刷的学时为12个小时,一共720分钟。最快可在12小时内完成。通常需要约三天左右的学习时间，每天投入最多四个小时
    ‌道路交通安全法律、法规和规章‌：这部分涵盖了《道路交通安全法》、《道路交通安全法实施条例》以及相关的法律法规，是考试中的重点内容。
    ‌交通信号及其含义‌：考试中会涉及各种交通标志、交通标线、交通信号灯的含义和作用，以及如何遵守这些交通信号。
    ‌安全行车、文明驾驶知识‌：包括安全驾驶的基本原则，如何做到文明驾驶，以及在不同天气和道路条件下的安全行车技巧。
    ‌机动车驾驶操作相关基础知识‌：涉及机动车总体构造、主要安全装置常识、日常检查和维护基本知识，以及车辆常见故障的识别和应急处理方法。
    ‌道路交通事故处理相关规定‌：考试中会涉及交通事故的责任划分、事故处理流程、事故现场保护等内容。
    此外，根据《机动车驾驶证申领和使用规定》，科目一考试还包括地方性法规等相关知识。考试形式为计算机操作考试，题型包括判断题、单项选择题，每题1分，满分100分，90分及以上为合格。
    ''';
    return getExpansionTile(Text(_title, style: _titleFontStyle),
        [Text(_text, style: _expansFontStyle)]);
  }

  Widget _item5({String title = "科目二考试内容"}) {
    var _title = title;
    var _text = '''
    驾车型有所不同：

小型汽车（C1）
包括倒车入库、侧方停车、坡道定点停车和起步、直角转弯、曲线行驶（俗称S弯）五项必考。部分地区可能还有第六项，如高速领卡等。

小型自动挡汽车（C2）和残疾人专用小型自动挡载客汽车（C5）
包括倒车入库、侧方停车、直角转弯、曲线行驶（俗称S弯）四项必考。

大车（A1、A2、A3、B1、B2）
考试项目较多，包括桩考（倒桩和移库）、坡道定点停车和起步、侧方停车、通过单边桥、曲线行驶、直角转弯、通过限宽门、窄路掉头，以及模拟高速公路、连续急弯山区路、隧道、雨（雾）天、湿滑路、紧急情况处置等，共14个项目。

轻型牵引挂车（C6）
考试项目包括C6桩考（只含倒桩，不移库）、曲线行驶和直角转弯。

三轮汽车（C4）和摩托车（D、E、F）
考试项目包括S形绕桩（桩考）、单边桥、坡道定点停车和起步三项。

合格标准
满分为100分，成绩达到80分或以上的为合格（部分地区可能有所差异，请以当地驾考规定为准）。
所有项目必须一次性全部合格，才算过关。
考试次数限制
每个学员有两次机会，第一次机会考试不合格，接着进行第二次考试。
两次考试都不合格者需要在10日后重新预约补考。
考生在学习驾驶证明有效期内，场地驾驶技能考试预约考试的次数不得超过五次。第五次考试仍不合格的，已考试合格的其他科目成绩作废。
    ''';
    return getExpansionTile(Text(_title, style: _titleFontStyle),
        [Text(_text, style: _expansFontStyle)]);
  }

  Widget _item6({String title = "科目三考试内容"}) {
    var _title = title;
    var _text = '''
    一、道路驾驶技能考试
     上车准备‌：学员需要对车辆进行一次“绕车一周的检查”，检查车辆外部及周边安全情况。
     起步‌：按照正确的顺序启动车辆，如调整座椅、后视镜，系安全带，检查仪表盘、灯光、挡位和手刹等，确保无误后安全起步。
     直线行驶‌：在直线路段保持车辆稳定行驶，注意速度和方向的控制。
     加减挡位操作‌：根据路况和车速合理地进行加减挡操作，挡位切换要流畅，不能低头看挡。
     变更车道‌：在需要变更车道时，先打转向灯，观察后方来车情况，确认安全后再平稳变更车道。(每次只能变更一个车道，不能连续变更车道)
     靠边停车‌：按照考官指令或路况需要，平稳地将车辆停靠在路边，注意保持与前车的安全距离。
     直行通过路口‌：在路口直行时，要观察交通信号灯和交通标志，确保安全后通过。
     路口左转弯、右转弯‌：在路口转弯时，要先打转向灯，观察左右来车情况，控制挡位在二挡以下，平稳转弯。
     通过人行横道线‌：在人行横道线前减速让行，注意观察行人动态，确保行人安全通过。
     通过学校区域、公共汽车站‌：在这些特殊区域要减速慢行，注意观察路况和行人，禁止鸣笛。
     会车‌：在与对向来车会车时，要保持安全距离，必要时主动靠路边让行。
     超车‌：超车时要先打左转向灯，观察后方是否有来车，确认安全后平稳超车，超车后要注意与被超越车辆保持安全距离。
     掉头‌：在允许掉头的路段，要先打左转向灯，选择合适的掉头地点，减速减挡后平稳掉头。
     于部分准驾车型（如大型客车、重型牵引挂车等），还可能需要增加山区、隧道、陡坡等复杂道路驾驶考试内容。

     、安全文明驾驶常识考试（部分地区可能作为科目四进行）
     部分考试内容主要包括安全文明驾驶操作要求、恶劣气象和复杂道路条件下的安全驾驶知识、爆胎等紧急情况下的临危处置方法以及发生交通事故后的处置知识等。

     意事项
     音指令随机出现，没有固定顺序，学员需要集中注意力，根据指令进行操作。
     考试过程中要保持冷静，遇到突发情况要正确处理，确保安全。
     住所有考试项目必须一次性全部合格，才算通过科目三考试。
    ''';
    return getExpansionTile(Text(_title, style: _titleFontStyle),
        [Text(_text, style: _expansFontStyle)]);
  }

  Widget _item7({String title = "扣分：1分项目"}) {
    var _title = title;
    var _text = text_item7;
    return getExpansionTile(Text(_title, style: _titleFontStyle),
        [Text(_text, style: _expansFontStyle)]);
  }

  Widget _item8({String title = "扣分：3分项目"}) {
    var _title = title;
    var _text = text_item8;
    return getExpansionTile(Text(_title, style: _titleFontStyle),
        [Text(_text, style: _expansFontStyle)]);
  }

  Widget _item9({String title = "扣分：6分项目"}) {
    var _title = title;
    var _text = text_item9;
    return getExpansionTile(Text(_title, style: _titleFontStyle),
        [Text(_text, style: _expansFontStyle)]);
  }

  Widget _item10({String title = "扣分：9分项目"}) {
    var _title = title;
    var _text = text_item10;
    return getExpansionTile(Text(_title, style: _titleFontStyle),
        [Text(_text, style: _expansFontStyle)]);
  }

  Widget _item11({String title = "扣分：12分项目"}) {
    var _title = title;
    var _text = text_item11;
    return getExpansionTile(Text(_title, style: _titleFontStyle),
        [Text(_text, style: _expansFontStyle)]);
  }

  Widget _item12({String title = "答题技巧，快速记忆;"}) {
    var _title = title;
    var _text = text_item12;
    return getExpansionTile(Text(_title, style: _titleFontStyle),
        [Text(_text, style: _expansFontStyle)]);
  }

  Widget _item13({String title = "道路通行相关知识点;"}) {
    var _title = title;
    var _text = text_item13;
    return getExpansionTile(Text(_title, style: _titleFontStyle),
        [Text(_text, style: _expansFontStyle)]);
  }

  Widget _item14({String title = "图标相关;"}) {
    var _title = title;
    var _text = text_item14;
    return getExpansionTile(Text(_title, style: _titleFontStyle),
        [Text(_text, style: _expansFontStyle)]);
  }

  Widget _item15({String title = "交警手势相关;"}) {
    var _title = title;
    var _text = text_item15;
    return getExpansionTile(Text(_title, style: _titleFontStyle),
        [Text(_text, style: _expansFontStyle)]);
  }

  Widget _item16({String title = "驾驶相关;"}) {
    var _title = title;
    var _text = text_item16;
    return getExpansionTile(Text(_title, style: _titleFontStyle),
        [Text(_text, style: _expansFontStyle)]);
  }

  Widget _item17({String title = "道路交通安全违法行为及处罚;"}) {
    var _title = title;
    var _text = text_item17;
    return getExpansionTile(Text(_title, style: _titleFontStyle),
        [Text(_text, style: _expansFontStyle)]);
  }
  Widget _item18({String title = "机动车基础知识;"}) {
    var _title = title;
    var _text = text_item18;
    return getExpansionTile(Text(_title, style: _titleFontStyle),
        [Text(_text, style: _expansFontStyle)]);
  }
  Widget _item19({String title = "科目二;"}) {
    var _title = title;
    var _text = text_item19;
    return getExpansionTile(Text(_title, style: _titleFontStyle),
        [Text(_text, style: _expansFontStyle)]);
  }
  Widget _item20({String title = "科目四;"}) {
    var _title = title;
    var _text = text_item20;
    return getExpansionTile(Text(_title, style: _titleFontStyle),
        [Text(_text, style: _expansFontStyle)]);
  }
}

class _Presenter {
  StateSetter? setState = null;

  ///body视图状态
  StateSetter? setStateBody;
}
